package com.example.onion.hxchat.room.wcdatabase;

/**
 * @author:onion
 * @data: 2020/7/8
 */

import android.content.Context;

import androidx.annotation.NonNull;
import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.migration.Migration;
import androidx.sqlite.db.SupportSQLiteDatabase;

import com.example.onion.hxchat.room.dao.ApplyDao;
import com.example.onion.hxchat.room.dao.FriendDao;
import com.example.onion.hxchat.room.dao.InfoDao;
import com.example.onion.hxchat.room.dao.MessageDao;
import com.example.onion.hxchat.room.dao.TeamNotificationDao;
import com.example.onion.hxchat.room.dao.UserDao;
import com.example.onion.hxchat.room.entity.Apply;
import com.example.onion.hxchat.room.entity.Friend;
import com.example.onion.hxchat.room.entity.Info;
import com.example.onion.hxchat.room.entity.Message;
import com.example.onion.hxchat.room.entity.TeamNotification;
import com.example.onion.hxchat.room.entity.User;


/**
 * Database中的3个参数依次为
 * 1、实体类，也就是保存的数据库表，如果有多个，那么都放在{}中即可
 * 2、数据库版本，当数据库的字段发生改变时使用，目前咱们用不上
 * 3、鬼知道啥玩意，false就得了
 */
@Database(entities = {User.class, Message.class, Friend.class, Info.class, Apply.class, TeamNotification.class}, version = 8, exportSchema = false)
abstract public class MyDataBaseWc extends RoomDatabase {

    /**
     * A singleton instance of database.
     */
    private static MyDataBaseWc INSTANCE;

    /**
     * 获取本地数据库的一个单一实例，因为获取一个实例的资源消耗很大.
     *
     * @param context application context
     *                For example, context.getApplicationContext();
     * @return an instance of native database named MyDatabase
     */
    public static synchronized MyDataBaseWc getInstance(Context context) {
        if (INSTANCE == null) {
            INSTANCE = Room.databaseBuilder(context, MyDataBaseWc.class, "MyDataBaseWc")
                    .fallbackToDestructiveMigration()//不做处理，破坏式的升级数据库
//                    .addMigrations(MIGRATION_2_3)     //保证保留迁移的本地数据
                    .build();
        }
        return INSTANCE;
    }

    /**
     * 每次升级数据库号的变化X——Y
     * 同时给出数据库表的变化
     */
    static final Migration MIGRATION_2_3 = new Migration(2, 3) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
            //说明从2到3数据库结构的变化，然后在getInstance中  .addMigrations(MIGRATION_2_3)
//            database.execSQL("ALTER TABLE User ADD COLUMN xxx TEXT");
        }
    };
    /**
     * 如果是删除表中的字段，由于SQLite是轻量级数据库，没有drop表字段的功能，需要：
     * 1，创建临时的表
     * 2，复制原先表中的数据
     * 3，删除原先的表
     * 4，将临时的表改成原先表的名字
     */
    static final Migration MIGRATION_3_4 = new Migration(3, 4) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {
          database.execSQL("CREATE TABLE User_temp (id INTEGER PRIMARY KEY NOT NULL,userId TEXT)");//1
          database.execSQL("INSERT INTO User_temp(id,userd)" +
                           "SELECT id,userId FROM User");//2
          database.execSQL("DROP TABLE User");//3
          database.execSQL("ALTER TABLE User_temp RENAME TO User");//4
        }
    };


    /**
     * 获取一个UserDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract UserDao getUserDao();

    /**
     * 获取一个ApplyDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract ApplyDao getApplyDao();

    /**
     * 获取一个MessageDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract MessageDao getMessageDao();

    /**
     * 获取一个InfoDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract InfoDao getInfoDao();

    /**
     * 获取一个FriendDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract FriendDao getFriendDao();

    /**
     * 获取一个TeamNotificationDao的对象
     *
     * @return an instance of UserDao
     */
    public abstract TeamNotificationDao getTeamNotificationDao();

//    /**
//     * 获取一个MasterDao的对象
//     *
//     * @return an instance of MasterDao
//     */
//    public abstract MasterDao getMasterDao();
}
